package com.deliccio.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.deliccio.connect.DAO;
import com.deliccio.dao.DetallePedidoDAO;
import com.deliccio.dao.EstadosgeneralesDAO;
import com.deliccio.dao.MesaDAO;
import com.deliccio.dao.PedidoMesaDAO;
import com.deliccio.dao.PedidosDAO;
import com.deliccio.dao.ProductoDAO;
import com.deliccio.dao.ProductoPorSucursalDAO;
import com.deliccio.dao.SucursalesDAO;
import com.deliccio.dao.UsuarioDAO;
import com.deliccio.entitys.DetallePedido;
import com.deliccio.entitys.Estadosgenerales;
import com.deliccio.entitys.Mesa;
import com.deliccio.entitys.PedidoMesa;
import com.deliccio.entitys.Pedidos;
import com.deliccio.entitys.Producto;
import com.deliccio.entitys.ProductoPorSucursal;
import com.deliccio.entitys.Sucursales;
import com.deliccio.entitys.Usuario;
import com.deliccio.service.PedidosMobileService;

@Service("PedidosMobileService")
public class PedidosMobileServiceImpl implements PedidosMobileService{


	private static Logger log = Logger.getLogger(PedidosMobileServiceImpl.class);
	@Autowired
	private ProductoPorSucursalDAO productoPorSucursalDAO;
	@Autowired
	private MesaDAO mesaDAO;
	@Autowired
	private ProductoDAO productoDAO;
	@Autowired
	private SucursalesDAO sucursalesDAO;
	@Autowired
	private EstadosgeneralesDAO estadosgeneralesDAO;
	@Autowired
	private UsuarioDAO usuarioDAO;
	@Autowired
	private DetallePedidoDAO detallePedidoDAO;
	@Autowired
	private PedidosDAO pedidosDAO;
	@Autowired
	private PedidoMesaDAO pedidoMesaDAO;

	@Override
	public Map<String, Object> devolverStockProductos(int idProducto,int idSucursal){
		System.out.println("idProducto:"+idProducto);
		System.out.println("idSucursal:"+idSucursal);
		ProductoPorSucursal productoPorSucursal=productoPorSucursalDAO.obtenerProductosPorSucursal(idProducto,idSucursal);
		System.out.println(productoPorSucursal);
		
		
		Map<String, Object> obj=new HashMap<String, Object>();
		obj.put("producto", productoPorSucursal.getId().getIdproducto());
		obj.put("cantidad", productoPorSucursal.getCantidad());
		
		return obj;
	}

	@Override
	public List<Mesa> obtenerMesaPorSucursal(int idSucursal){
		return mesaDAO.obtenerMesaPorSucursal(idSucursal);
	}

	@Override
	@Transactional
	public Map<String, Object> realizarPedido(int[] productos,int[] cantidad,int[] mesas,int sucursal,int usuario) throws Exception{
		

			List<Producto> lstproductos=new ArrayList<Producto>();
			if(productos.length > 0){
				for(int i=0;i < productos.length;i++){
					Producto p=productoDAO.get(productos[i]);
					lstproductos.add(p);
				}
			}
			List<Mesa> lstMesas=new ArrayList<Mesa>();
			if(productos.length > 0){
				for(int i=0;i < mesas.length;i++){
					Mesa m=mesaDAO.get(mesas[i]);
					lstMesas.add(m);
				}
			}

			Sucursales sucursales=sucursalesDAO.get(sucursal);
			Estadosgenerales estado=estadosgeneralesDAO.get(6);
			Usuario u=usuarioDAO.get(usuario);

			Pedidos pedido=new Pedidos(sucursales,new Double(0),new Date(),null,new Date(),new Date(),null,null,u,estado);
			pedidosDAO.guardar(pedido);

			for(int i=0;i < lstproductos.size();i++){
				Producto product=lstproductos.get(i);
				DetallePedido detallePedido=new DetallePedido(product,product.getPrecioUnitario(),cantidad[i],pedido);
				detallePedidoDAO.guardar(detallePedido);
			}

			for(int i=0;i < lstMesas.size();i++){
				Mesa m=lstMesas.get(i);
				if(m.getEstadosgenerales().getId() == 4){
					m.setEstadosgenerales(new Estadosgenerales(5));
					PedidoMesa pedidoMesa=new PedidoMesa(m.getId(),pedido.getId());
					pedidoMesaDAO.guardar(pedidoMesa);
				}else{
					log.error("Error mesa ya esta recervada");
				}
			}
			
			Map<String, Object> obj=new HashMap<String, Object>();
			obj.put("pedido", "1");

			return obj;
	}

	@Override
	@Transactional
	public int pedidoFinalizado(int pedido,int mesa){		
		Pedidos p = pedidosDAO.get(pedido);
		System.out.println(p);
		List<PedidoMesa> lstPedidoMesas = pedidoMesaDAO.obtenerMesasPorPedido(p);
		for(int i=0;i < lstPedidoMesas.size();i++){
			PedidoMesa pm=lstPedidoMesas.get(i);
			Mesa m = mesaDAO.get(pm.getPedidoMesaPK().getIdmesa());
			m.setEstadosgenerales(new Estadosgenerales(4));
		}
		return 0;
	}

	@Override
	public Map<String, Object>  obeterMesas(int idUsuario){
		List<Mesa> ltsMesasPorUsuario=pedidoMesaDAO.obtenerMesasPorUsuario(idUsuario);
		Map<String, Object> obj=new HashMap<String, Object>();		
		for(Mesa mesa : ltsMesasPorUsuario){
			obj.put("idMesa",mesa.getId());
		}	
		log.info(" lista de Mesas Mobile por usuario "+idUsuario+ " : "+ obj );		
		return obj;
	}

	@Override
	public Map<String, Object> cerrarMesas(int[] idsMesas){		
		Map<String, Object> obj=new HashMap<String, Object>();
		if(idsMesas!=null){
			if(idsMesas.length>0){
				int idMesa=idsMesas[0];
				Pedidos pedidos = pedidosDAO.obtenerPedidosPorMesa(idMesa);
				pedidos.setEstadosgenerales(new Estadosgenerales(10));
				pedidosDAO.guardar(pedidos);
				for(int id : idsMesas){
					Mesa mesa=mesaDAO.get(id);
					mesa.setEstadosgenerales(new Estadosgenerales(4));
					mesaDAO.guardar(mesa);		
				}
				obj.put("result",1);
				return  obj;
			}			
		}			
		obj.put("result",0);
		return  obj;
	}


}
